package site.addzero.cli.autoinit.common

import org.koin.core.annotation.Single
import site.addzero.cli.packagemanager.PackageManagerStrategty
import site.addzero.cli.platform.PlatformTools
import site.addzero.cli.platform.PlatformType
import site.addzero.cli.platform.runBoolean
import site.addzero.cli.platform.runCmd
import site.addzero.task.InitTask

/**
 * Git 自动初始化类
 * 负责检查 Git 是否安装，配置用户信息
 */
@Single
class AutoInitGit : InitTask {
    override val support: Boolean = true

    /**
     * 执行 Git 初始化任务
     */
    override suspend fun asynctask(): Boolean {
        // 检查 Git 是否安装
        if (!isGitInstalled()) {
            // 尝试安装 Git
            installGit()
        }

        // 配置 Git 用户信息
        configureGitUserInfo()
        return true
    }

    /**
     * 检查 Git 是否已安装
     */
    private fun isGitInstalled(): Boolean {
        val hasGit = when (PlatformTools.getPlatformType()) {
            PlatformType.WINDOWS -> "git --version".runBoolean()
            else -> "which git 2>/dev/null".runBoolean()
        }
        if (!hasGit) {
            println("未检测到 Git")
        } else {
            println("检测到 Git")
        }
        return hasGit
    }

    private suspend fun installGit() {
        println("正在尝试安装 Git...")

        try {
            val packageManager = PackageManagerStrategty.Companion.getSupportPackageManager()
            // 根据不同平台使用不同的包名
            val gitPackageName = when (PlatformTools.getPlatformType()) {
                PlatformType.WINDOWS -> "Git.Git"
                else -> "git"
            }

            val result = packageManager.installPackage(gitPackageName)

            if (result) {
                println("Git 安装成功")
            } else {
                println("Git 安装失败，请手动安装 Git")
                when (PlatformTools.getPlatformType()) {
                    PlatformType.WINDOWS -> println("Windows 用户可以使用 winget 安装: winget install Git.Git")
                    PlatformType.MACOS -> println("macOS 用户可以使用 Homebrew 安装: brew install git")
                    PlatformType.LINUX -> println("Linux 用户可以使用包管理器安装，例如: sudo apt install git")
                    else -> println("请根据您的操作系统手动安装 Git")
                }
            }
        } catch (e: Exception) {
            println("Git 安装过程中发生错误: ${e.message}")
            println("请手动安装 Git")
        }
    }

    /**
     * 配置 Git 用户信息（用户名和邮箱）
     */
    private fun configureGitUserInfo() {
        // 检查是否已配置用户名
        val userNameResult = "git config --global user.name".runCmd()
        val userName = if (userNameResult.isSuccess()) userNameResult.output.trim() else ""

        if (userName.isNotEmpty()) {
            println("Git 用户名已配置: $userName")
        } else {
            val configureUserName = PlatformTools.readBoolWithTrue("Git 用户名未配置，是否配置")
            if (configureUserName == true) {
                val inputUserName = PlatformTools.readLine("请输入 Git 用户名:")
                if (!inputUserName.isNullOrBlank()) {
                    "git config --global user.name \"${inputUserName}\"".runCmd()
                    println("Git 用户名已配置为: $inputUserName")
                }
            }
        }

        // 检查是否已配置邮箱
        val userEmailResult = "git config --global user.email".runCmd()
        val userEmail = if (userEmailResult.isSuccess()) userEmailResult.output.trim() else ""

        if (userEmail.isNotEmpty()) {
            println("Git 邮箱已配置: $userEmail")
        } else {
            val configureUserEmail = PlatformTools.readBoolWithTrue("Git 邮箱未配置，是否配置？")
            if (configureUserEmail == true) {
                val inputUserEmail = PlatformTools.readLine("请输入 Git 邮箱:")
                if (!inputUserEmail.isNullOrBlank()) {
                    "git config --global user.email \"${inputUserEmail}\"".runCmd()
                    println("Git 邮箱已配置为: $inputUserEmail")
                }
            }
        }
    }
}
